/*
 * Copyright 2009-2014 Tensosoft.
 *  
 * Licensed under the Tensosoft Opensource License (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *      http://www.tensosoft.com/eula.html
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.tansuosoft.discoverx.app.imgcode;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

/**
 * <p>
 * Simple GUI frontend to the library. Right now, only decodes a local file. This definitely needs some improvement. Just throwing something down to start.
 * </p>
 * 
 * @author Sean Owen
 */
public final class GUIRunner extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2673289149273711057L;

	private final JLabel imageLabel;
	private final JTextArea textArea;

	private GUIRunner() {
		imageLabel = new JLabel();
		textArea = new JTextArea();
		textArea.setEditable(false);
		textArea.setMaximumSize(new Dimension(400, 200));
		Container panel = new JPanel();
		panel.setLayout(new FlowLayout());
		panel.add(imageLabel);
		panel.add(textArea);
		setTitle("ZXing");
		setSize(400, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setContentPane(panel);
		setLocationRelativeTo(null);
	}

	public static void main(String[] args) throws MalformedURLException {
		GUIRunner runner = new GUIRunner();
		runner.setVisible(true);
		runner.chooseImage();
	}

	private void chooseImage() throws MalformedURLException {
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.showOpenDialog(this);
		File file = fileChooser.getSelectedFile();
		Icon imageIcon = new ImageIcon(file.toURI().toURL());
		setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight() + 100);
		imageLabel.setIcon(imageIcon);
		String decodeText = getDecodeText(file);
		textArea.setText(decodeText);
	}

	private static String getDecodeText(File file) {
		BufferedImage image;
		try {
			image = ImageReader.readImage(file);
		} catch (IOException ioe) {
			return ioe.toString();
		}
		LuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		Result result;
		try {
			result = new MultiFormatReader().decode(bitmap);
		} catch (ReaderException re) {
			return re.toString();
		}
		return String.valueOf(result.getText());
	}

}

